package com.liuceng.zen.lib.upyun;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * 文件类空间的demo
 */
public class FileBucketDemo {

  // 运行前先设置好以下三个参数
  private static final String BUCKET_NAME = "空间名称";
  private static final String OPERATOR_NAME = "操作员名称";
  private static final String OPERATOR_PWD = "操作员密码";

  /** 根目录 */
  private static final String DIR_ROOT = "/";
  /** 多级目录 */
  private static final String DIR_MORE = "/1/2/3/";
  /** 目录名 */
  private static final String FOLDER_NAME = "tmp";
  /** 上传到upyun的文件名 */
  private static final String FILE_NAME = "test.txt";

  /** 本地待上传的测试文件 */
  private static final String SAMPLE_TXT_FILE = System.getProperty("user.dir") + "/test.txt";

  private static UpYun upyun = null;

  static {
    File txtFile = new File(SAMPLE_TXT_FILE);

    if (!txtFile.isFile()) {
      System.out.println("本地待上传的测试文件不存在！");
    }
  }

  public static void main(String[] args) throws Exception {

    // 初始化空间
    upyun = new UpYun(BUCKET_NAME, OPERATOR_NAME, OPERATOR_PWD);

    // ****** 可选设置 begin ******

    // 切换 API 接口的域名接入点，默认为自动识别接入点
    // upyun.setApiDomain(UpYun.ED_AUTO);

    // 设置连接超时时间，默认为30秒
    // upyun.setTimeout(60);

    // 设置是否开启debug模式，默认不开启
    upyun.setDebug(true);

    // ****** 可选设置 end ******

    // 1.创建目录，有两种形式
    testMkDir();

    // 2.上传文件，图片空间的文件上传请参考 PicBucketDemo.java
    testWriteFile();
    // 3.获取文件信息
    testGetFileInfo();

    // 4.读取目录
    testReadDir();

    // 5.获取空间占用大小
    testGetBucketUsage();

    // 6.获取某个目录的空间占用大小
    testGetFolderUsage();

    // 7.读取文件/下载文件
    testReadFile();

    // 8.删除文件
    testDeleteFile();

    // 9.删除目录
    testRmDir();
  }

  /**
   * 获取空间占用大小
   */
  public static void testGetBucketUsage() {

    long usage = upyun.getBucketUsage();

    System.out.println("空间总使用量：" + usage + "B");
    System.out.println();
  }

  /**
   * 获取某个目录的空间占用大小
   */
  public static void testGetFolderUsage() {

    // 带查询的目录，如 "/" 或 "/tmp"
    String dirPath = DIR_ROOT;

    long usage = upyun.getFolderUsage(dirPath);

    System.out.println("'" + dirPath + "'目录占用量： " + usage + "B");
    System.out.println();
  }

  /**
   * 上传文件
   * 
   * @throws IOException
   */
  public static void testWriteFile() throws IOException {

    // 要上传的纯文字内容
    String content = "test content";

    // 要传到upyun后的文件路径
    String filePath = DIR_ROOT + FILE_NAME;
    // 要传到upyun后的文件路径：多级目录
    String filePath2 = DIR_MORE + FILE_NAME;

    /*
     * 上传方法1：文本内容直接上传
     */
    boolean result1 = upyun.writeFile(filePath, content);
    System.out.println("1.上传 " + filePath + isSuccess(result1));

    /*
     * 上传方法2：文本内容直接上传，可自动创建父级目录（最多10级）
     */
    boolean result2 = upyun.writeFile(filePath2, content, true);
    System.out.println("2.上传 " + filePath2 + isSuccess(result2));

    /*
     * 上传方法3：采用数据流模式上传文件（节省内存），可自动创建父级目录（最多10级）
     */
    File file = new File(SAMPLE_TXT_FILE);
    boolean result3 = upyun.writeFile(filePath, file, true);
    System.out.println("3.上传 " + filePath + isSuccess(result3));

    /*
     * 上传方法4：对待上传的文件设置 MD5 值，确保上传到 Upyun 的文件的完整性和正确性
     */
    File file4 = new File(SAMPLE_TXT_FILE);
    // 设置待上传文件的 Content-MD5 值
    // 如果又拍云服务端收到的文件MD5值与用户设置的不一致，将回报 406 NotAcceptable 错误
    upyun.setContentMD5(UpYun.md5(file4));

    boolean result4 = upyun.writeFile(filePath, file4, true);
    System.out.println("4.上传 " + filePath + isSuccess(result4));
    System.out.println();

  }

  /**
   * 获取文件信息
   */
  public static void testGetFileInfo() {

    // upyun空间下存在的文件的路径
    String filePath = DIR_ROOT + FILE_NAME;

    System.out.println(filePath + " 的文件信息：" + upyun.getFileInfo(filePath));
    System.out.println();
  }

  /**
   * 读取文件/下载文件
   * 
   * @throws IOException
   */
  public static void testReadFile() throws IOException {

    // upyun空间下存在的文件的路径
    String filePath = DIR_ROOT + FILE_NAME;

    /*
     * 方法1：直接读取文本内容
     */
    String datas = upyun.readFile(filePath);
    System.out.println(filePath + " 的文件内容:" + datas);

    /*
     * 方法2：下载文件，采用数据流模式下载文件（节省内存）
     */
    // 要写入的本地临时文件
    File file = File.createTempFile("upyunTempFile_", "");

    // 把upyun空间下的文件下载到本地的临时文件
    boolean result = upyun.readFile(filePath, file);
    System.out.println(filePath + " 下载" + isSuccess(result) + "，保存到 " + file.getAbsolutePath());
    System.out.println();
  }

  /**
   * 删除文件
   */
  public static void testDeleteFile() {

    // upyun空间下存在的文件的路径
    String filePath = DIR_ROOT + FILE_NAME;

    // 删除文件
    boolean result = upyun.deleteFile(filePath);

    System.out.println(filePath + " 删除" + isSuccess(result));
    System.out.println();
  }

  /**
   * 创建目录
   */
  public static void testMkDir() {

    // 方法1：创建一级目录
    String dir1 = DIR_ROOT + FOLDER_NAME;

    boolean result1 = upyun.mkDir(dir1);
    System.out.println("创建目录：" + dir1 + isSuccess(result1));

    // 方法2：创建多级目录，自动创建父级目录（最多10级）
    String dir2 = DIR_MORE + FOLDER_NAME;

    boolean result2 = upyun.mkDir(dir2, true);
    System.out.println("自动创建多级目录：" + dir2 + isSuccess(result2));
    System.out.println();
  }

  /**
   * 读取目录下的文件列表
   */
  public static void testReadDir() {

    // 参数可以换成其他目录路径
    String dirPath = DIR_ROOT;

    // 读取目录列表，将返回 List 或 NULL
    List<UpYun.FolderItem> items = upyun.readDir(dirPath);

    if (null == items) {
      System.out.println("'" + dirPath + "'目录下没有文件。");

    } else {

      for (int i = 0; i < items.size(); i++) {
        System.out.println(items.get(i));
      }

      System.out.println("'" + dirPath + "'目录总共有 " + items.size() + " 个文件。");
    }

    System.out.println();
  }

  /**
   * 删除目录
   */
  public static void testRmDir() {

    // 带删除的目录必须存在，并且目录下已不存在任何文件或子目录
    String dirPath = DIR_MORE + FOLDER_NAME;

    boolean result = upyun.rmDir(dirPath);

    System.out.println("删除目录：" + dirPath + isSuccess(result));
    System.out.println();
  }

  private static String isSuccess(boolean result) {
    return result ? " 成功" : " 失败";
  }
}
